package ui;

import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.layout.HorizontalLayout;
import org.uqbar.arena.layout.VerticalLayout;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.Label;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.tables.Column;
import org.uqbar.arena.widgets.tables.Table;
import org.uqbar.arena.windows.SimpleWindow;
import org.uqbar.arena.windows.WindowOwner;

import applicationModels.Juego;

import dominio.JardinZen;
import dominio.Mejora;
import dominio.Planta;

public abstract class AbstractJardinZenWindow extends SimpleWindow<JardinZen>{

	private static final long serialVersionUID = 1L;

	public AbstractJardinZenWindow(WindowOwner owner) {
		super(owner, Juego.getInstance().getUsuario().getJardinZen());
	}
	
	/**
	 * Es el nombre del tipo de jardin
	 * @return: "Acuatico" o "Terrestre"
	 */
	public abstract String getType();
	public abstract void cambiarAlSigJardin();
	
	@Override
	protected void createFormPanel(Panel mainPanel) {
		
		this.setTitle("Plantas vs Zombies");
		mainPanel.setLayout(new VerticalLayout());

		new Label(mainPanel).setText("Jardin Zen "+ this.getType().toUpperCase());
		
		this.seeFreeSpace(mainPanel);
		
		//this.agregarAlgunasPlantitasParaProbar(mainPanel);
		
		this.createPlantsGrid(mainPanel);
		
		this.botonesParaMejorarPlanta(mainPanel);
		
		this.createButtonsPanel(mainPanel);
	}
	
	protected void agregarAlgunasPlantitasParaProbar(Panel mainPanel) {
		// Agregando algunas plantas Terrestres para mostrar
		Planta peas = new Planta("Peas Shooter", 10, 10, true);
		peas.getMejorasDisponibles().add(new Mejora("Mejora 10 defensa",100, 0, 10));
		peas.getMejorasDisponibles().add(new Mejora("Mejora 10 ataque", 100, 10, 0));
		
		this.getModelObject().agregarPlanta(peas);
		this.getModelObject().agregarPlanta(new Planta("Girasol", 20, 10, true));
		this.getModelObject().agregarPlanta(new Planta("Otra Planta", 24, 54, true));
		this.getModelObject().agregarPlanta(new Planta("Planta Fea", 1, 1, true));
		
		// Agregando algunas plantas Acuaticas para mostrar
		this.getModelObject().agregarPlanta(new Planta("Planta acuatica", 10, 10, false));
		this.getModelObject().agregarPlanta(new Planta("Lenteja", 24, 54, false));
		this.getModelObject().agregarPlanta(new Planta("Acuatica trucha", 1, 1, false));
	}
	
	// *************************************************************************
	// ** LUGARES LIBRES EN EL JARDIN ZEN
	// *************************************************************************

	/**
	 * Muestra los lugares libres que quedan en el Jardin Zen actual
	 * @param mainPanel
	 */
	protected void seeFreeSpace(Panel mainPanel) {
		Panel freeSpacePanel = new Panel(mainPanel);
		freeSpacePanel.setLayout(new HorizontalLayout());
		new Label(freeSpacePanel).setText("Lugares libres: ");
		new Label(freeSpacePanel).bindValueToProperty("espaciosLibres"+ this.getType());
	}
	
	// *************************************************************************
	// ** PLANTAS DEL JARDIN ZEN
	// *************************************************************************
	
	/**
	 * Muestra la tabla de plantas que tiene el jardin Zen. La planta seleccionada
	 * se bindea con el dominio, para poder ver la lista de mejoras de esta planta
	 * @param mainPanel
	 */
	protected void createPlantsGrid(Panel mainPanel) {
		Table<Planta> table = new Table<Planta>(mainPanel, Planta.class);
		table.setHeigth(200);
		table.setWidth(450);

		table.bindItemsToProperty("jardin"+ this.getType());
		table.bindValueToProperty("plantinAMejorar");

		this.describePlantsGrid(table);
	}

	/**
	 * Crea tres columnas para la tabla de plantas del jardin Zen,
	 *  ( Planta, Pts Defensa, Pts Ataque )
	 * @param table
	 */
	protected void describePlantsGrid(Table<Planta> table) {
		new Column<Planta>(table) //
			.setTitle("Planta")
			.setFixedSize(150)
			.bindContentsToProperty("nombre");

		new Column<Planta>(table) //
			.setTitle("Pts Defensa")
			.setFixedSize(150)
			.bindContentsToProperty("puntosDefensa");

		new Column<Planta>(table) //
			.setTitle("Pts Ataque")
			.setFixedSize(150)
			.bindContentsToProperty("puntosAtaque");
	}
	
	
	// *************************************************************************
	// ** BOTONERA PARA MEJORAR PLANTAS
	// *************************************************************************
	
	/**
	 * Muestra la planta a mejorar y el boton que lleva a
	 * la pantalla de mejoras de esta planta
	 * @param mainPanel
	 */
	protected void botonesParaMejorarPlanta(Panel mainPanel) {
		Panel mejoras = new Panel(mainPanel);
		mejoras.setLayout(new HorizontalLayout());
		
		new Label(mejoras).setText("Seleccionado:");
		new Label(mejoras).setWidth(100).setHeigth(50).bindValueToProperty("plantinAMejorar.nombre");
		
		new Button(mejoras) //
			.setCaption("Mejorar")
			.onClick(new MessageSend(this, "verMejorasDePlanta"));
	}
	
	
	// *************************************************************************
	// ** BOTONERA VOLVER AL JUEGO O IR AL OTRO JARDIN ZEN
	// *************************************************************************
	
	/**
	 * Muestra dos botones:
	 *   "Jugar", para volver a la pantalla de juego, cerrando la pantalla actual
	 *   "Ir al otro Jardin Zen", abre la ventana del otro jardin Zen y cierra la actual
	 * @param mainPanel
	 */
	protected void createButtonsPanel(Panel mainPanel) {
		Panel botones = new Panel(mainPanel);
		botones.setLayout(new HorizontalLayout());	
		
		new Button(botones) //
			.setCaption("Jugar")
			.onClick(new MessageSend(this, "close"));
		
		new Button(botones) //
			.setCaption("Ir al otro Jardin Zen")
			.onClick(new MessageSend(this, "cambiarAlSigJardin"));
	}
	
	public void verMejorasDePlanta() {
		new MejorasPlantaWindow(this, this.getModelObject().getPlantinAMejorar()).open();
	}
	
	@Override
	protected void addActions(Panel actionsPanel) {
	}
}
